package com.yupi.yuaicodemother.core;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.yupi.yuaicodemother.ai.model.HtmlCodeResult;
import com.yupi.yuaicodemother.ai.model.MultiFileCodeResult;
import com.yupi.yuaicodemother.model.enums.CodeGenTypeEnum;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 文件保存器（已弃用）
 *
 * 职责：
 * 1. 根据代码类型（HTML / MULTI_FILE）生成唯一的本地目录；
 * 2. 将 AI 生成的代码字符串写入对应的文件（index.html / style.css / script.js）；
 * 3. 返回生成的目录 File 对象，供后续打包、部署、预览使用。
 *
 * 注意：
 * - 该类被标记为 @Deprecated，业务代码应迁移至 CodeFileSaverExecutor；
 * - 所有文件统一保存在当前 JVM 工作目录下的 tmp/code_output 目录。
 */
@Deprecated
public class CodeFileSaver {

    /**
     * 所有生成代码的根目录：
     * System.getProperty("user.dir") 表示当前 JVM 启动路径
     * 最终路径示例：/workspace/project/tmp/code_output
     */
    private static final String FILE_SAVE_ROOT_DIR = System.getProperty("user.dir") + "/tmp/code_output";

    /* ----------------------------------------------------------
     * 保存 HTML 单文件代码
     * ----------------------------------------------------------
     * 步骤：
     * 1. 调用 buildUniqueDir 生成唯一目录：tmp/code_output/html_雪花ID
     * 2. 将 HtmlCodeResult 中的 htmlCode 写入 index.html
     * 3. 返回目录 File 对象，供控制器或后续流程使用
     *
     * @param htmlCodeResult 封装了完整 HTML 字符串
     * @return 生成的目录对象
     */
    public static File saveHtmlCodeResult(HtmlCodeResult htmlCodeResult) {
        // 1. 创建唯一目录
        String baseDirPath = buildUniqueDir(CodeGenTypeEnum.HTML.getValue());
        // 2. 写入 index.html
        writeToFile(baseDirPath, "index.html", htmlCodeResult.getHtmlCode());
        // 3. 返回目录句柄
        return new File(baseDirPath);
    }

    /* ----------------------------------------------------------
     * 保存多文件代码（HTML + CSS + JS）
     * ----------------------------------------------------------
     * 步骤：
     * 1. 同样生成唯一目录：tmp/code_output/multi_file_雪花ID
     * 2. 分别把 HtmlCodeResult 中的三段代码写入：
     *    - index.html
     *    - style.css
     *    - script.js
     * 3. 返回目录 File 对象
     *
     * @param result 封装了 html、css、js 三段字符串
     * @return 生成的目录对象
     */
    public static File saveMultiFileCodeResult(MultiFileCodeResult result) {
        String baseDirPath = buildUniqueDir(CodeGenTypeEnum.MULTI_FILE.getValue());
        writeToFile(baseDirPath, "index.html", result.getHtmlCode());
        writeToFile(baseDirPath, "style.css",  result.getCssCode());
        writeToFile(baseDirPath, "script.js",  result.getJsCode());
        return new File(baseDirPath);
    }

    /* ----------------------------------------------------------
     * 构建唯一目录路径
     * ----------------------------------------------------------
     * 规则：
     * 目录名 = 代码类型_雪花ID
     * 示例：html_1712123456789012345
     *
     * @param bizType 代码生成类型字符串，如 "html"、"multi_file"
     * @return 生成的绝对路径
     */
    private static String buildUniqueDir(String bizType) {
        // 1. 组装目录名：bizType_雪花ID
        String uniqueDirName = StrUtil.format("{}_{}", bizType, IdUtil.getSnowflakeNextIdStr());
        // 2. 拼接完整路径
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        // 3. 自动创建目录（若不存在则递归创建）
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /* ----------------------------------------------------------
     * 通用写文件工具
     * ----------------------------------------------------------
     * 说明：
     * - 目录不存在时会被 FileUtil.writeString 自动创建
     * - 使用 UTF-8 编码，避免中文乱码
     *
     * @param dirPath  文件所在目录
     * @param filename 文件名，如 index.html
     * @param content  文件内容字符串
     */
    private static void writeToFile(String dirPath, String filename, String content) {
        // 1. 拼接完整文件路径
        String filePath = dirPath + File.separator + filename;
        // 2. 写入文件，覆盖模式，字符集 UTF-8
        FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
    }
}